package com.zhuozhou.jdyc.util.jiami;

import android.content.Context;

import com.zhuozhou.jdyc.util.log.LogUtil;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import Decoder.BASE64Decoder;

/**
 * Created by 方舟 on 2017/7/28.
 * RSA加解密
 */

public class RSAUtils {
    // 编码方式
    private final static String ENCODE = "UTF-8";
    // 秘钥，长度为16，和服务器端保持一致
    private final static String defaultKey = "password12345678";
    //AES是加密方式 CBC是工作模式 PKCS5Padding是填充模式（要和服务端保持一致）
    private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding";
    //填充值，16位的字符串，和服务器端保持一致
    private static final String zeroIv = "1234567812345678";
    // 前缀，可要可不要。
    private final static String defaultPrefix = "";

    //加密
    public static String enCode(Context context, String data) {
        String source = data;
        try {
            // 从字符串中得到公钥
//			PublicKey publicKey = RSAUtilsHelper.loadPublicKey(RSAUtilsHelper.PUCLIC_KEY);
            // 从文件中得到公钥
            InputStream inPublic = context.getResources().getAssets().open("rsa_public_key.pem");
            PublicKey publicKey = RSAUtilsHelper.loadPublicKey(inPublic);
            // 加密
            byte[] encryptByte = RSAUtilsHelper.encryptData(source.getBytes("UTF-8"), publicKey);
            // 为了方便观察吧加密后的数据用base64加密转一下，要不然看起来是乱码,所以解密是也是要用Base64先转换
//            BASE64Encoder encoder = new BASE64Encoder();
//            String ss = Base64Util.encode(encryptByte);
            return Base64Util.encode(encryptByte);
        } catch (Exception e) {
            e.printStackTrace();
            return "加密错误";
        }
    }

    //解密
    public static String deCode(Context context, String data) {
        try {
            // 从字符串中得到私钥
            // PrivateKey privateKey = RSAUtilsHelper
            // .loadPrivateKey(RSAUtilsHelper.PRIVATE_KEY);
            // 从文件中得到私钥
            InputStream inPrivate = context.getResources().getAssets().open("rsa_private_key.pem");
            PrivateKey privateKey = RSAUtilsHelper.loadPrivateKey(inPrivate);
            // 因为RSA加密后的内容经Base64再加密转换了一下，所以先Base64解密回来再给RSA解密
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] b1 = decoder.decodeBuffer(data);
            byte[] decryptByte = RSAUtilsHelper.decryptData(b1, privateKey);
            String decryptStr = new String(decryptByte);
            return decryptStr;
        } catch (Exception e) {
            e.printStackTrace();
            return "解密错误";
        }
    }

    /**
     * AES加密
     *
     * @param content
     * @return
     * @throws Exception
     */
    public static byte[] aesEncryptToBytes(String content) throws Exception {
        SecretKeySpec sks = new SecretKeySpec(defaultKey.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
        cipher.init(Cipher.ENCRYPT_MODE, sks, new IvParameterSpec(zeroIv.getBytes()));
        return cipher.doFinal(content.getBytes(ENCODE));
    }

    /**
     * 加密
     */
    public static String aesEncrypt(String keyWord, String encrypted) throws Exception {
        String encryptStr = null;
        try {
            SecretKeySpec key = new SecretKeySpec(keyWord.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(encrypted.getBytes("utf-8"));
            encryptStr = parseByte2HexStr(result);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        LogUtil.show(encryptStr);
        return encryptStr;
    }

    /**
     * 密钥key ,默认补的数字，补全16位数，以保证安全补全至少16位长度,android和ios对接通过
     *
     * @param key    密钥key
     * @param length 密钥应有的长度
     * @param text   默认补的文本
     * @return 密钥
     */
    private static String toMakeKey(String key, int length, String text) {
        // 获取密钥长度
        int strLen = key.length();
        // 判断长度是否小于应有的长度
        if (strLen < length) {
            // 补全位数
            StringBuilder builder = new StringBuilder();
            // 将key添加至builder中
            builder.append(key);
            // 遍历添加默认文本
            for (int i = 0; i < length - strLen; i++) {
                builder.append(text);
            }
            // 赋值
            key = builder.toString();
        }
        return key;
    }

    /**
     * 将二进制转换成16进制
     */
    public static String parseByte2HexStr(final byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (byte element : buf) {
            String hex = Integer.toHexString(element & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
}
